package com.sxpi.order.mode.user;

import com.sxpi.order.mode.user.member.NormalVipService;
import com.sxpi.order.mode.user.member.SVipService;
import com.sxpi.order.mode.user.member.VipService;
import com.sxpi.order.mode.user.member.YearVipService;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Component;

/**
 * @Author: 董伟豪
 * @Date: 2022/10/29 22:31
 */
@Component
public class UserBeanFactorySpringSingle implements ApplicationContextAware {

    private static ApplicationContext applicationContext;

    /**
     * 如果不想用map的方式来保持单例，也可以使用这样的方式
     * 使用上下文来维持单例
     * 但是这样的方式必须要给他们加上@Service注解
     * spring的bean一定是在@Autowired的时候创建的，之前spring在加载IOC容器的时候不会立马的创建好（都是加在key-----beandefined来映射的）
     * 这里的本质实际上也是使用Map的方式
     * @param vip
     * @return
     */
    public static IPayService getInstanceSingle(Integer vip){
        if(vip.equals(1)){
            return applicationContext.getBean(NormalVipService.class);
        }else if(vip.equals(2)){
            return applicationContext.getBean(VipService.class);
        }else if(vip.equals(3)){
            return applicationContext.getBean(SVipService.class);
        }else if(vip.equals(4)){
            return applicationContext.getBean(YearVipService.class);
        }
        return null;
    }

    /**
     * spring的后置通知
     * @param applicationContext
     * @throws BeansException
     */
    @Override
    public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
        UserBeanFactorySpringSingle.applicationContext = applicationContext;
    }
}
